package struts.ext.base;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.BeansException;
import org.springframework.web.struts.DelegatingRequestProcessor;

public class ExtRequestProcessor extends DelegatingRequestProcessor {
	
	/**
	 * 写在前面的话：
	 *    在struts1和Spring整合的时候一般都是Action交给Spring来创建，因为Struts1的Action配置的path都是以/开头的，
	 * 这样就需要在spring的配置文件中写入类似下面的配置：
	 * 	  	<bean name="/myAction" class="com.abc.struts.test.MyAction"/>
	 * 	     当然，也可以使用Annotation，如：
	 *    	@Component("/myAction") //如果不写value，默认存在Context中的key是myAction，就是类的首字母小写
	 *    	public class MyAction
	 * 	     所以就有了这个扩展，如果您的Action的path是类的首字母小写，那么就可以直接在Action前面加上@Component，而不用写
	 *    value。本类会自动处理的。
	 *  
	 * 
	 * 
	 * 只处理以/开头的struts1的action，如"/myAction"，否则交给父类DelegatingRequestProcessor去处理。
	 * 实际上在ApplicationContext中以"myAction"为key来找Action,这样只需要在struts的Action类前加上@Component就可以了,不需要写配置文件。
	 * 如果找不到，也转交给父类去处理，这样就以"/myAction"为key来查找Action，为的是兼容之前的在ApplicationContext.xml对action的配置
	 * （如：<bean name="/myAction" class="com.abc.struts.test.MyAction"/>）。
	 * 
	 * @see org.springframework.web.struts.DelegatingRequestProcessor#getDelegateAction(org.apache.struts.action.ActionMapping)
	 */
	protected Action getDelegateAction(ActionMapping mapping) throws BeansException {
		String beanName = determineActionBeanName(mapping);
		if(beanName.startsWith("/")){
			String newBeanNameRemoveSlash = beanName.substring(1);
			if (!getWebApplicationContext().containsBean(newBeanNameRemoveSlash)) {
				return super.getDelegateAction(mapping);//找不到交给父类处理
			}
			return (Action) getWebApplicationContext().getBean(newBeanNameRemoveSlash, Action.class);
		}
		return super.getDelegateAction(mapping);
	}
}
